package com.qfedu.aunt.commons.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.qfedu.aunt.commons.pojo.Perm;
import com.qfedu.aunt.commons.mapper.PermMapper;
import com.qfedu.aunt.commons.service.PermService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qfedu.aunt.commons.vo.MenuShowVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author xiaobobo
 * @since 2022-10-31
 */
@Service
public class PermServiceImpl extends ServiceImpl<PermMapper, Perm> implements PermService {

    @Autowired
    private PermMapper permMapper;

    @Override
    public List<MenuShowVo> findMenuAll() {
        //查询所有的菜单
//        QueryWrapper<Perm> permQueryWrapper = new QueryWrapper<>();
//        permQueryWrapper.eq("type_level",1);
        List<Perm> perms = permMapper.selectList(null);
        //将上面查询出来的数据 弄成MenuShowVo
        List<MenuShowVo> menuShowVos=buildMenuShowVo(perms);
        //构建我们的树形结构
        List<MenuShowVo> menuShowVoList = buildMenuTree(menuShowVos);
        return menuShowVoList;
    }

    /**
     * 将查询出来的数据弄成MenuShowVo对象
     * @param perms
     * @return
     */
    private List<MenuShowVo> buildMenuShowVo(List<Perm> perms) {
        //定义一个装数据的容器
        List<MenuShowVo> menuShowVos=new ArrayList<>();
        perms.stream().forEach(p->{
            MenuShowVo menuShowVo = new MenuShowVo();
            // 从新赋值
            menuShowVo.setId(p.getPermId());
            menuShowVo.setLabel(p.getTitle());
            menuShowVo.setParentId(p.getParentId());
            menuShowVo.setPermId(p.getPermId());
            menuShowVos.add(menuShowVo);
        });
        return menuShowVos;
    }


    /**
     * 将返回的这个集合 弄成树形结构
     * 要用到递归
     * @param permList
     * @return
     */
    private List<MenuShowVo> buildMenuTree(List<MenuShowVo> permList) {
        //首先初始化一个容器 用来存储这个树形结构
        List<MenuShowVo> perms=new ArrayList<>();
        //循环找到这个递归的入口
        permList.stream().forEach(p->{
            //说明是最大的一级的这个菜单
            if(p.getParentId().equals("-1")){
                //接下来找到了递归的入口
                perms.add(findChildMenu(p,permList));
            }
        });
        return perms;
    }

    /**
     * 找到孩子的这个菜单
     * @param p
     * @param permList
     * @return
     */
    private MenuShowVo findChildMenu(MenuShowVo p, List<MenuShowVo> permList) {
        //遍历整个菜单的集合
        permList.stream().forEach(p1->{
            //如果条件成立 那么说明 我们的p1是p的孩子
            if(p.getPermId().equals(p1.getParentId())){
                if(p.getChildren()==null){
                    p.setChildren(new ArrayList<>());
                }
                //然后执行到这里来 说明p1是p的孩子
                p.getChildren().add(findChildMenu(p1,permList));
            }
        });
        //不管怎样 最终都要将这个p标签返回去  还要将这个p中的孩子设置进去
        return p;
    }
}
